如何在Promise.all()中使用布尔值

时间:2018-03-17 04:41:43

标签: javascript angular typescript promise

我想做这样的事情:

statusReady: boolean = false;
jobsReady: boolean = false;

ready() {
  return Promise.all([statusReady, jobsReady]);
}

......这个想法基本上是后来我可以做到的:

this.ready().then(() => {
  // Do stuff here when we're all ready
});

如果一切都已经存在,我希望承诺立即解决,如果有任何错误,它等待状态为真,然后结算。我在任何地方使用ready()函数,以确保某些部分已完成加载。

2 个答案:

答案 0 :(得分:0)

所以,如果我是正确的,你会问一下如果一个布尔列表都是真的,你就会创建一个解决的承诺吗?

我创建了一个完全正确的功能。它将booleans的一个对象作为它唯一的arg,并返回一个只要它们都是真的就会解析的promise。

这是功能:

function whenBoolListIsTruePromise (boolList) {
    return new Promise(function (resolve, reject) {

        // Check if all values of boolList are already true
        var initializedAsTrue = true;
        Object.values(boolList).forEach(function (currentBoolValue) {
            if (!currentBoolValue) initializedAsTrue = false;
        }); 

        if (initializedAsTrue) {
            resolve();
        } else {

            // The following watches changes to any of the bools in the boolList, and resolves the promise when all are true.

            // 1. Copy boolList data to _actualData.
            // 2. For each key-value pair in boolList, change it to a :set and :get property that accesses _actualData.
            // 3. Every time a set is run, check if everything in actual data is now true. If it is, resolve promise.

            var _actualData = Object.assign({}, boolList); 
            Object.entries(boolList).forEach(function ([boolName, boolValue]) {
                Object.defineProperty(boolList, boolName, {
                    configurable: true,
                    set: function (newV) {
                        var allTrue = true;
                        _actualData[boolName] = newV;
                        Object.values(_actualData).forEach(function (currentBoolValue) {
                            if (!currentBoolValue) allTrue = false;
                        });

                        if (allTrue) {
                            // Remove :set and :get, bringing back to a regular simple object
                            Object.entries(_actualData).forEach(function ([boolName2, boolValue2]) {
                                Object.defineProperty(boolList, boolName2, {
                                    configurable: true,
                                    value: boolValue2,
                                });
                            });

                            resolve();
                        }
                    },

                    get: function () {
                        return _actualData[boolName];
                    }
                });
            });
        }
    });
}

您可以通过创建布尔对象并将其作为此函数的参数传递来使用此功能。当所有这些布尔值都设置为true时,此函数将返回一个解析。

var myBoolList = {"statusReady": false, "jobsReady": false};

whenBoolListIsTruePromise(myBoolList).then(function () {
    console.log("All values are now true!");
}, function (error) {
    console.error(error);
});

myBoolList.statusReady = true;
myBoolList.jobsReady = true;

以下是一个工作示例:

function whenBoolListIsTruePromise (boolList) {
    return new Promise(function (resolve, reject) {

        // Check if all values of boolList are already true
        var initializedAsTrue = true;
        Object.values(boolList).forEach(function (currentBoolValue) {
            if (!currentBoolValue) initializedAsTrue = false;
        }); 
        
        if (initializedAsTrue) {
            resolve();
        } else {

            // The following watches changes to any of the bools in the boolList, and resolves the promise when all are true.
            
            // 1. Copy boolList data to _actualData.
            // 2. For each key-value pair in boolList, change it to a :set and :get property that accesses _actualData.
            // 3. Every time a set is run, check if everything in actual data is now true. If it is, resolve promise.
            
            var _actualData = Object.assign({}, boolList); 
            Object.entries(boolList).forEach(function ([boolName, boolValue]) {
                Object.defineProperty(boolList, boolName, {
                    configurable: true,
                    set: function (newV) {
                        var allTrue = true;
                        _actualData[boolName] = newV;
                        Object.values(_actualData).forEach(function (currentBoolValue) {
                            if (!currentBoolValue) allTrue = false;
                        });

                        if (allTrue) {
                            // Remove :set and :get, bringing back to a regular simple object
                            Object.entries(_actualData).forEach(function ([boolName2, boolValue2]) {
                                Object.defineProperty(boolList, boolName2, {
                                    configurable: true,
                                    value: boolValue2,
                                });
                            });
                            
                            resolve();
                        }
                    },
                    
                    get: function () {
                        return _actualData[boolName];
                    }
                });
            });
        }
    });
}

var myBoolList = {"statusReady": false, "jobsReady": false};

whenBoolListIsTruePromise(myBoolList).then(function () {
    console.log("All values are now true!");
}, function (error) {
    console.error(error);
});

myBoolList.statusReady = true;
myBoolList.jobsReady = true;

此函数的工作原理是:为boolList对象中的每个键创建:set和:get访问器。只要设置(更改)booList对象中的任何内容,就会运行:set函数。我已经这样做了:set函数检查所有布尔值是否为真,并解析了它们的承诺。

这是一篇有用的文章我发现了一些关于:get和:set的讨论 https://javascriptplayground.com/es5-getters-setters/

答案 1 :(得分:-3)

你不能在Promise.all()方法中使用boolean。 MDN中的article 明确指出只有promise可以在Promise.all()方法中传递。

相反,您可以使用另外两个Promise,它们将在值为true时解析。在你的代码片段中,我不明白这两个值将如何变为真。如果你可以发布这两个值会如何改变,我想我们会帮助你正确地塑造代码。