Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有条件地在另一个承诺中呼唤承诺_Javascript_Promise_Q - Fatal编程技术网

Javascript 有条件地在另一个承诺中呼唤承诺

Javascript 有条件地在另一个承诺中呼唤承诺,javascript,promise,q,Javascript,Promise,Q,这基本上是我的代码,使用: 但是,我现在需要根据特定条件执行一个步骤。此步骤调用另一个也返回承诺的对象。所以我有嵌套的承诺,如果这是正确的术语 大概是这样的: let d = Q.defer(); let result = { name: 'peter' }; if (someParameter) { otherService.getValue() // Let's say it returns 'mary' .then((res) => {

这基本上是我的代码,使用:

但是,我现在需要根据特定条件执行一个步骤。此步骤调用另一个也返回承诺的对象。所以我有嵌套的承诺,如果这是正确的术语

大概是这样的:

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
属性仍然是“peter”)。可能是因为我内心的承诺在以后的某个时刻得到了解决

我也尝试过这个,但是如果我打电话给另一个返回承诺的服务,它就不起作用了。如果我只设置该值,它确实有效:

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
并链接它们。但是,如果要嵌入它们,则必须
返回嵌入的
承诺
链:

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
,它将处理流。因此,当我们
内部返回
时,我们返回的值可以是另一个
承诺
或只是一个值。机器将为我们负责拆开包装。

不推荐使用延期包装。如果有的话,您应该使用
Q.Promise
构造函数,但您甚至不需要它。只需使用创建一个符合您的价值的承诺

现在,您可以(也应该)简化代码以

let d = someParameter ? otherService.getValue() : Q('peter');
return d.then(res => ({
    name: res
}));

请看一看您的代码是否正常工作,但过于复杂,我不得不认为它没有用处。@Bergi很抱歉您有这种感觉。我只是复制了这篇文章,以免进一步混淆作者。是的,代码可能更具表现力。因为这篇文章是关于承诺控制流的,所以有必要展示一个完整的示例。在我看来,作者对嵌入的承诺等感到困惑。这很复杂,但同时我对它进行了重构。此外,与我们实际代码中的示例相比,这里的示例微不足道。但这个答案向我解释了我做错了什么。
let d = someParameter ? otherService.getValue() : Q('peter');
return d.then(res => ({
    name: res
}));