我正在尝试了解承诺是什么以及如何将回调转换为承诺。当我将我的代码转换为承诺时,我对裁判非常困惑。如果您向我展示如何将此代码转换为一个简单示例,我将非常感激。
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);
});
});
});
答案 0 :(得分:1)
承诺不是每种回调的替代品;相反,它是围绕一个特定任务的抽象,它将成功一次或失败一次。您转换的代码看起来更像是一个EventEmitter,其中一个事件可能发生多次次,因此用Promise实现替换.on('child_added', ...)
并不合适。
但是,稍后,您有一个.once(...)
电话。这有点接近Promise,因为它只会完成一次。所以,如果你真的想转换它,那么它的外观如下:
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
});
});
});
答案 1 :(得分:0)
我不确定我是否理解这个问题,以及你是否" on"正在回复承诺或只是倾听,但在您的代码中,您已经嵌套了“#then”,这不是处理承诺的常用方法,我不确定您想要达到的目标这里。
你可以做(假设on函数返回一个我怀疑的承诺)
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(...)