Promise 在等待结果之前被解雇

Promise fired before waiting for result

我对 promises 很陌生,我的以下代码产生了一些意想不到的结果,但我不知道为什么。

Main.js 中的 Taskrunner.SyncObjects 函数应该等待填充的 selectedCourses 变量,但它不会立即触发。这导致使用空的 selectedCourses 变量。

为什么 TaskRuner.SyncObjects 函数在有结果之前运行?

Main.js

function StartSync(){

var a = Settings.LoadCourseList(standardOSPathUserData);
var b = a.then(function(){
    console.log("b is running");
    var selectedCourses = Settings.courseList;

    return TaskRunner.SyncObjects(selectedCourses).then(function(){
        fileSyncRunning = false;
    });
}).catch(function(error){
    console.log("StartSync Error message: " + error);
});

}

Settings.js

Settings.LoadCourseList = function(osPath){
  var pathToCourseListSettings = osPath + courseListFileName;
  return new Promise(function(resolve, reject){
            try {
                return connection.Login().then(function(){
                    return connection.GetCourseList().then(function(result){
                        var allCourses = [];
                        for(var p=0; p<=result.length-1;p++){
                          allCourses.push({courseID: result[p].courseID, courseName: result[p].courseName, selected: true});
                        }
                        courseListJSON = JSON.stringify(allCourses);
                        return courseListJSON;
                    }).then(function(courseListJSON){
                        fs.appendFileSync(pathToCourseListSettings,courseListJSON,encoding='utf8');
                        console.log("New Course settings file created and filled: " + pathToCourseListSettings);
                        return resolve();
                    });
                }).then(function(){
                    return resolve();
                });
            } catch (e) {
                console.log("FAIL courseList settingsfile creation - Error: " + e.code);
                return reject(e);
            }
  });
};

似乎 Settings.courseList 从未在 Settings.js

中赋值

您可以尝试添加

Settings.courseList = allCourses;

上线前

courseListJSON = JSON.stringify(allCourses);

或者更好的是,您可以采用 promise 方式,并使用 allCourses 解决 promise。

做出来自Settings.LoadCourseList(standardOSPathUserData)的承诺; return所有课程,改变

return connection.Login().then(function(){
    return connection.GetCourseList().then(function(result){
        var allCourses = [];
        for(var p=0; p<=result.length-1;p++){
          allCourses.push({courseID: result[p].courseID, courseName: result[p].courseName, selected: true});
        }
        courseListJSON = JSON.stringify(allCourses);
        return courseListJSON;
    }).then(function(courseListJSON){
        fs.appendFileSync(pathToCourseListSettings,courseListJSON,encoding='utf8');
        console.log("New Course settings file created and filled: " + pathToCourseListSettings);
        return resolve();
    });
}).then(function(){
    return resolve();
});

return connection.Login().then(function(){
    return connection.GetCourseList().then(function(result){
        var allCourses = [];
        for(var p=0; p<=result.length-1;p++){
          allCourses.push({courseID: result[p].courseID, courseName: result[p].courseName, selected: true});
        }
        var courseListJSON = JSON.stringify(allCourses);
        fs.appendFileSync(pathToCourseListSettings,courseListJSON,encoding='utf8');
        console.log("New Course settings file created and filled: " + pathToCourseListSettings);
        return allCourses;
    });
});

并接收承诺结果更改

var b = a.then(function(){
    console.log("b is running");
    var selectedCourses = Settings.courseList;

var b = a.then(function(allCourses){
    console.log("b is running");
    var selectedCourses = allCourses;