Javascript 承诺在返回之前不解决

Javascript 承诺在返回之前不解决,javascript,promise,reduce,Javascript,Promise,Reduce,我很难弄清楚承诺是如何起作用的。我有下面的代码,我正在通过数组执行迭代 runOpts.automationResults.reduce(函数p,val){ 返回p.then(函数(){ 返回pd.run(val); }); },Promise.resolve())。然后(函数(rallyResults){ log('从方法返回'); console.log('rallyResults',rallyResults); },函数(err){ log('error in reduce',err);

我很难弄清楚承诺是如何起作用的。我有下面的代码,我正在通过数组执行迭代

runOpts.automationResults.reduce(函数p,val){
返回p.then(函数(){
返回pd.run(val);
});
},Promise.resolve())。然后(函数(rallyResults){
log('从方法返回');
console.log('rallyResults',rallyResults);
},函数(err){
log('error in reduce',err);

});此代码中存在许多问题,但主要问题是,当您在
.then()
处理程序中运行另一个异步操作时,必须从
.then()
返回该承诺,才能将其正确链接到主承诺链中。如果您不这样做,则父承诺根本不会链接到该内部承诺(它成为自己的独立承诺链,您无法对其进行监控),并且父承诺不会等待内部承诺

以下是所做的更改:

  • 删除不必要地将一个承诺包装在另一个承诺中的承诺反模式(只需返回您已经拥有的承诺)
  • 从.then()处理程序中返回嵌套的承诺以适当地链接它们
  • 将错误日志合并到一个位置并重新显示错误,以便正确返回
  • 删除
    Promise.all()
  • 移除
    results.push(结果数组)因为似乎没有指向该点的任何点。按照我在下面编写的方式,顶级承诺解析为
    resultsArray
    ,因为只有一个,所以我认为没有必要将其嵌入到另一个数组中
  • 以下是修改后的代码:

    ProcessDatabase.prototype.run = function (options) {
        var dal = new db();
        var resultsArray = {
            results: [],
            options: {},
            testSet: [],
            testIteration: '',
            multipleSets: 0,
            totalCount: 0
        }
        resultsArray.options = options;
        return dal.getAutomationResultsByBuild(options.Build).then((results) => {
            resultsArray.results = results;
            resultsArray.totalCount = results.data.length;
            return resultsArray;
        }).then(function (resultsArray) {
            //console.log('resultsArray', resultsArray);
            //console.log(`Starting Rally publishing for Build '${resultsArray.options.Build}'...`)
    
            if (resultsArray.options.Executiontype == 'ci') {
    
                return rallyApi.autoDiscoverTestSets().then((sets) => {
                    resultsArray.testSet = sets.sets;
                    resultsArray.testIteration = sets.iteration;
                    resultsArray.multipleSets = sets.sets.length > 1;
                    return resultsArray;
                });
            } else {
                return rallyApi.addTestSet('Automation: ' + resultsArray.options.type + ' - ' + resultsArray.options.build, config.get('rally.projects.testing.ref'), null, resultsArray.options.SessionUser).then((resp) => {
                    //console.log(resp);
                    console.log('New test set ' + resp.FormattedID + ' created.');
                    resultsArray.multipleSets = 0;
                    resultsArray.testSet = resp.FormattedID;
                    return resultsArray;
                });
            }
    
        }).catch(err => {
            // log error and rethrow
            console.log(err);
            throw err;
        });
    }
    

    reduce不知道承诺。这是一种同步方法。Iow:您不能在reduce中执行异步。@Keith-以这种方式使用
    .reduce()
    是序列化异步操作的常见设计模式。如果操作得当,它绝对有效。它在数组内容中循环执行
    Promise.resolve().then(fn).then(fn).then(fn)
    ,该数组序列化对数组上异步操作的访问。您没有正确使用
    Promise.all()
    。你需要向它传递一系列承诺。
    run
    需要避免失败!你好,J00。谢谢你的回复。我已经更新了我最初的帖子,试图更好地解释我需要发生什么。.reduce中的数组中有多条记录。我想得到的是一个数组,其中包含了每种类型的附加信息。上面控制台日志中设置的第二个“结果”是我需要返回到调用.reduce的内容。这就是为什么我要写ProcessDatabase.prototype.run作为承诺。显然我做错了。是否可以从ProcessDatabase.prototype.run中获得整合的“结果”数组,如我所需