2016-12-04 52 views
0

我对承诺非常陌生,以下代码会产生一些意想不到的结果,但我不知道为什么。承诺在等待结果前被解雇

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); 
      } 
    }); 
}; 
+0

什么是'TaskRunner.SyncObjects'? – trincot

+0

@trincot这是一个我不能发布代码的承诺函数。你认为问题在于这个功能吗?结果需要在“TaskRunner.SyncObjects”函数之前定义,所以此函数的内部工作无关紧要。对? – Dragon54

+0

事实上,如果你期望'SyncObjects'运行之前的结果,那么它与该函数无关。我误解了这个问题。 – trincot

回答

1

看来Settings.courseList在Settings.js

从未赋值

你可以尝试添加

Settings.courseList = allCourses; 
上线

courseListJSON = JSON.stringify(allCourses); 

或者更好的是,你能做到这一点的承诺方式和解决allCourses的承诺。

要使Settings.LoadCourseList(standardOSPathUserData)的承诺;返回allCourse,改变

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; 
+0

我简直不敢相信......我对我的承诺怀有疑虑,我没有注意到那些小但非常重要的细节。非常感谢!!!添加“Settings.courseList = allCourses;”诀窍。 – Dragon54