2017-01-24 119 views
1

我在嘗試瞭解承諾的內容以及如何將回調轉換爲承諾。雖然我正在將我的代碼轉換爲承諾,但我對該文件非常困惑。如果您向我展示如何將此代碼轉換爲簡單示例,我將非常感激。如何將回調轉換爲承諾

database.ref('/users').on("child_added").then(function(snap){ 
    var subData = snap.val(); 

    database.ref('/subs/' + subData.subid + '/pri/' + snap.key).once("value").then(function(userSnap) { 
    var userData = userSnap.val(); 

    subData.name = userData.name; 
    subData.age = userData.age; 

    database.ref('/subs/' + subData.subid).once("value",function(subDSnap) { 
     var subDData = subDSnap.val(); 
     subData.type = subDData.type; 
     database_m.ref('/users/' + snap.key).set(subData); 
    }); 
    }); 
}); 
+1

需要更多的信息。你使用的方法據說是返回Promises的庫嗎?你提供的代碼示例太淺了。 – Sgnl

回答

1

承諾並不代替每種回調類型;而是圍繞一個特定任務的抽象,這個特定任務要麼成功一次,要麼一次失敗。您正在轉換的代碼看起來更像EventEmitter,可能發生事件多個次,因此用Promise實現替換.on('child_added', ...)並不合適。

但是,稍後您將撥打.once(...)電話。這更接近一個承諾,它只會完成一次。所以如果你真的想轉換它,這可能是這樣的:

function get(database, url) { 
    return new Promise(function (resolve, reject) { 
    database 
     .ref(url) 
     .once('value', resolve) 
     .once('error', reject); 
    }); 
} 

database.ref('/users').on("child_added", function(snap) { 
    var subData = snap.val(); 

    get(database, '/subs/' + subData.subid + '/pri/' + snap.key) 
    .then(function(userSnap) { 
     var userData = userSnap.val(); 

     subData.name = userData.name; 
     subData.age = userData.age; 

     return get(database, '/subs/' + subData.subid); 
    }) 
    .then(function(subDSnap) { 
     var subDData = subDSnap.val(); 
     subData.type = subDData.type; 
     database_m.ref('/users/' + snap.key).set(subData); 
    }) 
    .catch(function (err) { 
     // handle errors 
    }); 
    }); 
}); 
0

我不知道我理解的問題,如果你的「上」返回一個承諾或只是聽,但在你的代碼中嵌套了「於是」,這是不是對付常見的方式承諾,我不確定這就是你想在這裏實現的。

你可以這樣做(假設在函數返回一個承諾,我懷疑)

database.ref('/users').on("child_added") 
.then(function(snap){/* do something with the first part of your snap function*/}) 
.then (results => {/* do something else, such as your second ref call*/}) 
.catch(error => {/* manage the error*/}) 

要了解的承諾,有許多在線的例子,但我真的很喜歡的是promise tutorial at google,這個漂亮的片段,解釋它

var promise = new Promise(function(resolve, reject) { 
    // do a thing, possibly async, then… 

    if (/* everything turned out fine */) { 
    resolve("Stuff worked!"); 
    } 
    else { 
    reject(Error("It broke")); 
    } 
}); 

然後,一旦你有一個返回這個承諾的功能,你可以開始做

.then(...) 
.then(...) 
.then(...) 
.catch(...) 
+0

參考更改時應該怎麼做? – user19283043

+0

所以我不確定我完全得到你的代碼,因爲@Sgnl更多的細節會有所幫助。但總的來說,你需要有某個返回承諾的函數。你有嗎?是database.ref .... on ..返回一個承諾,或者你只是在聽一些事件。一旦你有承諾,你可以開始鏈接。然後()。然後()。然後()指定你想要按順序做什麼 – Fab