2016-07-11 2 views
0

제 질문은 약속의 가치와 이전 약속 값을 제공합니다. 문제는 첫 번째 반환 약속에서 두 번째 약속 "runItem -> testItem"으로 전달되는 항목입니까?약속의 이전 가치 제공

또는 모든 약속을 통해 항목을 전달해야합니까?

예 :

db.items.find({_id: id}).then(function (res) { 
 
    runItem(item); 
 
}) 
 

 
function runItem(item) { 
 
    removeFromQueue(item.id).then(function() { 
 
    testItem(item); 
 
    }); 
 
} 
 

 
function testItem(item) { 
 
    ... 
 
} 
 
    
 
function removeFromQueue(item) { 
 
    return db.queue.remove({_id: item._id}); 
 
}

편집 : 어쩌면이 더 나은 예를 들면 다음과 같습니다

우리가 액세스 할 수있는 원래의 속성 항목거나 덮어 쓸 것 인 경우 다음에 함수가 호출됩니까?

function start(id) 
 
    db.find({_id: id}).then(function (item) { 
 
    test(item).then(function (res) { 
 
     // can we access original attribute item, or is it going to be overwritten when the next time function is called 
 
     resolve({ res: res, item: item }); 
 
    }); 
 
    }); 
 
} 
 

 
function test(item) { 
 
    return $test(item).then(function() { 
 
    resolve('success'); 
 
    }); 
 
}

+0

처럼 당신은 약속 개체를 반환하기로되어있다. – thefourtheye

+0

코드로 무엇을 하려는지 이해할 수 없지만 이전 값은 저장되지 않으므로 필요한 경우 저장해야합니다. 일부 경우에는 bluebird 약속 기능을 사용하는 것이 편리합니다. 객체에 바인딩 됨). –

+0

"item"을 testItem 함수에 전달하려고하지만 "item"이 runItem 함수의 속성입니다. 코드는 일반적으로, 대부분 가능한 것으로 알고 싶다. 한 약속에서 다른 약속으로 변수를 전달하는 가장 좋은 방법은 무엇인지 알아야한다. – puppeteer701

답변

0

당신은 이전 약속의 반환 값을 변경하고 단순히 그것을 반환 할 수 있습니다. 다음 약속이 영향을받을 것입니다. 이 예제를 확인하십시오

var promise = new Promise(function(res,rej){ res({data: 7}) }); // start with {data:7} 
 
var promise1 = promise.then(function(res){ console.log('promise.then: ' + JSON.stringify(res)); return res.data; }); // log: {data:7}. return: 7 
 
var promise2 = promise1.then(function(res) { console.log('promise1.then : ' + res); return res + 1;}); // log:7. return 8. 
 
var promise3 = promise2.then(function(res) { console.log('promise2.then: ' + res); return res;}); // log:8. return 8. 
 
var promise4 = promise3.then(function(res) { console.log('promise3.then: ' + res); return res;}); // log:8. return 8.

+0

'Promise.resolve ({data : 7})', 생성자가 필요 없습니다. –

-1

당신이 게시 한 예 것은 반환에게 promise 개체를하지 않습니다.

다음은 연결된 사물의 예입니다 (promise). 당신이 runItem(item)itemtestItem(res)에 의해 사용되는 원 총리는 res으로 then에 반환을 동일 해결 functionBpromise 객체에 전달 볼 수 있습니다 위의 예에서

functionA = function(text) {return new Promise(function(resolve) { 
resolve(text); 
console.log(text + " at function A"); 
}); 
} 

functionB = function(text) {return new Promise(function(resolve) { 
resolve(text); 
console.log(text + " at function B"); 

});} 


functionA("test").then(function (res) 
{ 
console.log(res + " at then"); 
runItem(res); 

}) 

function runItem(item) { 
functionB(item).then(function (res) { 
console.log(res + " at Function Run Item"); 
testItem(res); 

}); 
} 

function testItem(item) { 
console.log(item + " at Function testItem"); 
} 

. 당신이 runItem(item)의에 어떤 작업을 수행하려는 경우 약속이 Promise.props에게 기능을 시도 FunctionB

+0

예를 들어 db.queue = Mongodb 콜렉션입니다.내가 보는 것에 대한 당신의 모범에서 모든 약속을 통해 아이템을 해결 데이터로 전달해야 할 것입니다. 해결 호출에 넣지 않고 항목을 전달할 수있는 방법이 있습니까? – puppeteer701

0

에 대한 해결되기 전에

item을 수정할 수 있습니다.

뭔가

... 
{ 
    ... 
    return Promise.props({res: res, item: item}). 
     .then(function(result){ 
      return Promise.resolve({ res: res, item: item }); 
     }); 
}