Javascript 先承诺后承诺

Javascript 先承诺后承诺,javascript,promise,ecmascript-6,resolve,es6-promise,Javascript,Promise,Ecmascript 6,Resolve,Es6 Promise,我有一个承诺,我希望它只有在内心的承诺已经解决的时候才能解决。现在,它在“loadend”回调中到达“resolve”函数之前解析 我错过了什么?我对你应该如何使用决心以及如何在另一个承诺中使用承诺感到困惑 我在网上找不到任何有用的东西 在下面的示例中,我基本上加载了一组文件,对于每个文件,我都会得到一个blob,我希望将这个blob传递到文件读取器中 将所有文件传递给文件读取器后,我想转到promise链中的下一个函数 现在,它转到链中的下一个函数,而不等待调用resolve var list

我有一个承诺,我希望它只有在内心的承诺已经解决的时候才能解决。现在,它在“loadend”回调中到达“resolve”函数之前解析

我错过了什么?我对你应该如何使用决心以及如何在另一个承诺中使用承诺感到困惑

我在网上找不到任何有用的东西

在下面的示例中,我基本上加载了一组文件,对于每个文件,我都会得到一个blob,我希望将这个blob传递到文件读取器中

将所有文件传递给文件读取器后,我想转到promise链中的下一个函数

现在,它转到链中的下一个函数,而不等待调用resolve

var list = [];
var urls = this.files;

urls.forEach(function(url, i) {
    list.push(
        fetch(url).then(function(response) {
            response.blob().then(function(buffer) {

                var promise = new Promise(
                    function(resolve) {

                        var myReader = new FileReader();
                        myReader.addEventListener('loadend', function(e) {
                            // some time consuming operations
                            ...
                            window.console.log('yo');
                            resolve('yo');
                        });

                        //start the reading process.
                        myReader.readAsArrayBuffer(buffer);
                    });

                promise.then(function() {
                    window.console.log('smooth');
                    return 'smooth';
                });

            });
        })
    );
});

...

// run the promise...
Promise
    .all(list)
    .then(function(message){
        window.console.log('so what...?');
    })
    .catch(function(error) {
        window.console.log(error);
    });

当您不从
返回
任何内容,然后
回调时,它将采用同步操作,并立即使用结果(
未定义的
)解析结果承诺

您需要
从每个异步函数返回一个承诺,包括
然后
要链接的回调

具体来说,您的代码应该是

var list = this.files.map(function(url, i) {
//                   ^^^^ easier than [] + forEach + push
    return fetch(url).then(function(response) {
        return response.blob().then(function(buffer) {
            return new Promise(function(resolve) {
                var myReader = new FileReader();
                myReader.addEventListener('loadend', function(e) {
                    …
                    resolve('yo');
                });
                myReader.readAsArrayBuffer(buffer);
            }).then(function() {
                window.console.log('smooth');
                return 'smooth';
            });
        })
    });
});
或者更好的是:


我有两个函数,都返回了一个包含嵌套承诺的承诺(由于模块设计),在嵌套承诺的末尾,我调用了包含承诺的resolve,但觉得这是错误的。但多亏了您的示例,我已经能够放弃包含承诺的内容,而只是返回了嵌套承诺的链。这使我的代码更易于阅读。我只是想给你竖起大拇指。
var list = this.files.map(function(url, i) {
    return fetch(url).then(function(response) {
        return response.blob();
    }).then(function(buffer) {
        return new Promise(function(resolve) {
            var myReader = new FileReader();
            myReader.addEventListener('loadend', function(e) {
                …
                resolve('yo');
            });
            myReader.readAsArrayBuffer(buffer);
        });
    }).then(function() {
        window.console.log('smooth');
        return 'smooth';
    });
});