2016-07-11 2 views
0

私の質問には約束が含まれており、連鎖約束の以前の価値を提供しています。質問は、最初の返品約束から2回目の約束 "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}); 
 
}

EDIT: 多分これが良い例だろう。

は、我々は、元の属性項目にアクセスすることができ、またはそれはときに上書きされようとしています次回の関数呼び出しは?

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)itemはさらにtestItem(res)によって使用されるWENが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"); 
} 

あなたは約束をFunctionB

+0

これは一例ですが、db.queue = Mongodbコレクションです。私が見ているもののあなたの例から、私はすべての約束を解決データとして渡す必要があります。解決を呼びかけることなく、アイテムを通過させる方法がありますか? – puppeteer701

0

のために解決される前に、あなたはそれを修正することができitemrunItem(item)の上の任意の操作を行いたい場合はPromise.props機能を試してみてください。

何か

... 
{ 
    ... 
    return Promise.props({res: res, item: item}). 
     .then(function(result){ 
      return Promise.resolve({ res: res, item: item }); 
     }); 
} 
関連する問題