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;
我对 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;