Google云端功能 - 警告避免嵌套承诺承诺/不嵌套

时间:2018-04-15 17:32:04

标签: firebase firebase-realtime-database google-cloud-functions

鉴于以下功能,我收到警告:

  

警告避免嵌套承诺promise / no-nesting(第6行)

我应该如何重新构建功能以修复警告?

function FindNearbyJobs(uid, lat, lng){
  return admin.database().ref(`users/${uid}/nearbyjobs`).remove().then(data => {
    return new Promise((resolve, reject) => {
      const geoQueryJobs = geoFireJobs.query({center: [lat, lng], radius: 3 });
      geoQueryJobs.on("key_entered", (key, location, distance) => {
        return Promise.all([admin.database().ref(`jobs/${key}/category`).once('value'), admin.database().ref(`users/${uid}/account/c`).once('value')]).then(r => {
          const cP = r[0];
          const cO = r[1];
          if (cO.val().includes(cP.val())){
            return admin.database().ref(`users/${uid}/nearbyjobs/${key}`).set({ d: distance });
          }else{
            return null;
          }
        });
      });
      geoQueryJobs.on("ready", () => {
        resolve();
      });
    });
  });
}

1 个答案:

答案 0 :(得分:20)

你有一个承诺then()来自另一个承诺then()。这被认为是糟糕的风格,并使您的代码难以阅读。如果您要执行一系列工作,最好将工作链接到之后,而不是将嵌套在另一个中。所以,而不是像这样嵌套:

doSomeWork()
.then(results1 => {
    return doMoreWork()
    .then(results2 => {
        return doFinalWork()
    })
})

按照以下方式对作品进行排序:

doSomeWork
.then(results => {
    return doMoreWork()
})
.then(results => {
    return doFinalWork()
})

搜索该错误消息也会产生this helpful discussion