在另一个承诺调用承诺,有条件
问题描述:
这基本上是我的代码,使用q:在另一个承诺调用承诺,有条件
let d = Q.defer();
let result = {
name: 'peter'
};
d.resolve(result);
return d.promise;
不过,我现在需要执行基于特定条件的一个步骤。这一步调用另一个也返回承诺的对象。所以我有嵌套承诺,如果这是正确的术语。
事情是这样的:
let d = Q.defer();
let result = {
name: 'peter'
};
if (someParameter) {
otherService.getValue() // Let's say it returns 'mary'
.then((res) => {
result.name = res;
});
}
d.resolve(result);
return d.promise;
然而,这并不工作(在name
属性仍是 '彼得')。可能是因为我内心的承诺在以后的时间里解决了?
我也试过这个,但它不起作用,如果我打电话给其他服务,它返回一个承诺。它确实工作,如果我只是设置的值:
let d = Q.defer();
let result = {
name: 'peter'
};
d.resolve(result);
return d.promise
.then((data) => {
if (someParameter) {
// Works
data.name = 'john';
// Doesn't work
otherService.getValue()
.then((res) => {
data.name = res;
});
}
return data;
});
这里的名称将是'约翰',而不是'玛丽'。
很明显,我误解了承诺,但我无法把头绕在它周围。
答
承诺控制流程是... 好玩?
无论如何,你几乎在那里,你可以嵌入一个Promise
在Promise
以及链接它们。但是,如果你把它们嵌入,你必须return
嵌入式Promise
链:
let d = Q.defer();
let result = {
name: 'peter'
};
d.resolve(result);
return d.promise
.then((data) => {
if (someParameter) {
// Should work now that we return the Promise
return otherService.getValue()
.then((res) => {
data.name = res;
// And we have to return the data here as well
return data;
});
}
return data;
});
Promise
resolve
可取的值或其他Promise
,它会处理的流程。所以,当我们在then
之内return
时,我们返回的值可以是另一个Promise
或者只是一个值。机器会照顾我们的包装。
答
不推荐使用延迟。如果有的话,你应该使用Q.Promise
构造函数,但你甚至不需要它。只需使用Q
function即可创建一个满足您的价值的承诺。
现在你可以(也应该)简化您的代码
let d = someParameter ? otherService.getValue() : Q('peter');
return d.then(res => ({
name: res
}));
看一看[在承诺的if-else流(http://stackoverflow.com/q/26599798/1048572) – Bergi