如何将回调转换为promise

时间:2017-01-24 23:58:36

标签: javascript

我正在尝试了解承诺是什么以及如何将回调转换为承诺。当我将我的代码转换为承诺时,我对裁判非常困惑。如果您向我展示如何将此代码转换为一个简单示例,我将非常感激。

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

2 个答案:

答案 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(...)