2017-01-24 54 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