等待嵌套的JS承诺完成,然后再解决原始的承诺

时间:2019-01-02 17:13:25

标签: javascript promise nested

我对Promises还是陌生的,在解决嵌套的诺言之前要等待嵌套的诺言完成所有执行,这一点让我有些麻烦。

原始代码

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 not waiting for promises to resolve before ending
  2. Wait until nested promises resolve
  3. Wait for promises inside Promise.all to finish before resolving it

解决方案

托马斯(Thomas)在标记的答案中解决了原始问题。经过进一步检查,最终问题已在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;
    });
}

2 个答案:

答案 0 :(得分:4)

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

第二,要让外部Promise等待嵌套的PRomise,您需要将嵌套的Promise返回到外部Promise。
then()内部返回一个Promise将使最终的Promise解析为您在其中重新调整的Promise的值。

最后,类似.then(value => value).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;
    }
  });
}

答案 1 :(得分:1)

基本技巧是确保所有{ "result": { "#ifcondition(#valueof($.values.date),condition,#valueof($.values.value),fail)" } } 调用都在嵌套的promise的resolve()方法内。

类似的东西:

then()

如果需要嵌套在上面的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) { result = anotherFunction(array); <-- Spot 1 }); promise.then(function () { }); resolve(result); <--- Spot 2 }); } else { resolve(null); } }); }); }; 中,只需将其粘贴在其中即可。

还请注意,您无需返回您的解决方案。只需打电话给他们。