提供先前的承诺价值

时间:2016-07-11 08:22:06

标签: javascript promise bluebird

我的问题涉及承诺并提供以前的连锁承诺价值。问题是,项目是从第一个返回承诺传递到第二个承诺" 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');  
  });
}




3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

尝试 Promise.props 功能。

这样的东西
...
{
    ...
    return Promise.props({res: res, item: item}).
        .then(function(result){
            return Promise.resolve({ res: res, item: item }); 
        });
}

答案 2 :(得分:-1)

您发布的示例并不会返回promise个对象。

以下是promise中链接内容的示例,请查看。

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)' s item已传递给promise functionB的{​​{1}}对象,而已解决的对象在then中返回{1}} res,由testItem(res)进一步使用。

如果您想对runItem(item) item进行任何操作,可以在FunctionB

的承诺解决之前对其进行修改