2016-12-04 5 views
0

私は約束が新しく、次のコードは予期しない結果を招いていますが、その理由はわかりません。プロミスが結果を待つ前に解雇

Main.js内のTaskrunner.SyncObjects関数は、filledCourses変数が満杯になるのを待つ必要がありますが、代わりにただちに起動します。これにより、空の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}); 
     } 
     var courseListJSON = JSON.stringify(allCourses); 
     fs.appendFileSync(pathToCourseListSettings,courseListJSON,encoding='utf8'); 
     console.log("New Course settings file created and filled: " + pathToCourseListSettings); 
     return allCourses; 
    }); 
}); 

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(); 
}); 

を変更し、

var b = a.then(function(allCourses){ 
    console.log("b is running"); 
    var selectedCourses = allCourses; 
にその約束の結果の変更

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

を受信する

+0

私はそれがスリップしたとは信じられません...私は私の約束について疑いを持っていましたが、私はその小さな、しかし非常に重要な細部に注意を払っていませんでした。どうもありがとうございます!!! "Settings.courseList = allCourses;"を追加するトリックをしました。 – Dragon54

関連する問題