首页 > 解决方案 > 在解决原始承诺之前等待嵌套的 JS 承诺完成

问题描述

我是 Promises 的新手,在解决原始 Promise 之前等待嵌套的 Promise 完成所有执行的概念有点麻烦。

原始代码

function getSomething(text) {
    return new Promise(function (resolve, reject) {
        getElse(text).then(function (items) {
            if (items.length !== 0) {

                /* Stuff here */

                getElseElse(box).then(function (moreItems) {

                    /* Stuff here */

                    return array;
                }.then(function (array) {
                    var promise = new Promise(function (resolve, reject) {
                        /* anotherFunction() is asynchronous */
                        result = anotherFunction(array); <-- Spot 1
                    });
                    promise.then(function () { });
                });

                return resolve(result); <--- Spot 2

            }
            else {
                return resolve(null);
            }
        });
    });
};

更新的代码- 更好但仍然没有像我想要的那样完全工作。

function getSomething(text) {
    return getElse(text).then(function (items) {
        if (items.length !== 0) {

            /* Stuff here */

            return getElseElse(box).then(function (moreItems) {

                /* Stuff here */

                return array;
            }).then(anotherFunction);

        } else {
            return null;
        }
    });
}

然后,在单个视图页面中,我有这个:

getSomething(text).then(function (result) {
    /* Do something here using result */
    /* But result is undefined and I think still pending */
});

我已经使用 Thomas 的帮助优化了原始函数,但视图中的原始调用似乎在result制定之前仍在继续。

在执行视图内部的代码之前,我想getSomething()完全完成并返回。到目前为止,这还没有实现。result.then

我发现了一些帖子,这些帖子指出了我认为正确的方向,Promise.all但我似乎无法真正了解这些信息,所以我希望有人可以帮助解释我的具体情况。

有帮助的帖子是:

  1. Promise Chain 在结束前不等待 Promise 解决
  2. 等到嵌套的 Promise 解决
  3. 等待 Promise.all 中的 Promise 完成,然后再解决它

解决方案

托马斯在标记的答案中解决了原始问题。anotherFunction()经过进一步检查,最终问题在内部得到了解决。

起初:

function anotherFunction(array) {
    return new Promise(function (resolve, reject) {
        return anotherGet(parcels).then(function (list) {
            /* Do stuff here without a return */
        });
    });
}

固定版本:

function anotherFunction(array) {
    return anotherGet(parcels).then(function (list) {
        /* Do stuff here */
        return list;
    });
}

标签: javascriptpromisenested

解决方案


首先,避免 Promise/Deferred 反模式。很少你需要创建自己的 Promise,通常你有一些返回 Promise 的函数;用那个。

其次,为了让外部 Promise 等待一个嵌套的 Promise,您需要将该嵌套的 Promise 返回到外部 Promise。
在内部返回一个 Promisethen()将使生成的 Promise 解析为您在内部重新调整的 Promise 的值。

最后,类似.then(value => value)or的东西.then(value => Promise.resolve(someFunction(value)))是没有意义的。您的包装器anotherFunction基本上只是通过参数并返回结果。

因此,您的伪代码应如下所示:

function getSomething(text) {
  return getElse(text).then(function (items) {
    if (items.length !== 0) {
      /* Stuff here */
      return getElseElse(box).then(function (moreItems) {
        /* Stuff here */
        return array;
      }).then(anotherFunction);
    } else {
      return null;
    }
  });
}

推荐阅读