【问题标题】:Should i use Promise to solve this task?我应该使用 Promise 来解决这个任务吗?
【发布时间】:2017-01-23 17:09:32
【问题描述】:

我正在从站点请求项目,我需要检查主题的描述中是否包含“已购买”一词,然后才将其保存到数据库。

所以,当我做某事时:

items.forEach(function(item) {
  if(!isPurchased)
    saveToDb(item)
}

但它不起作用(在任何情况下都保存了项目),因为 IF 语句 (isPurchased) 中提供的函数返回未定义(我认为是因为异步节点行为)。

所以,我写了 Promise notPurchased :

function notPurchased(advert) {
  return new Promise(
      function(resolve, reject) {
        if (description.length == 0)
          resolve();

        return request('adverts', {'count' : 50},  function(resp) {

          for (i = 0; i < resp.count; i++) {

            if(resp.response.items[i].text.match('purchased') != null)
              reject('This item has been purchased!');
          }

          resolve();
        });
      });
}

然后在 forEach 循环中使用这个 promise:

response.items.forEach(function(item) {
   notPurchased(item).then(function() {
     DB.storeItem(item);
   });
});

这是一个好的方法吗?我对 NodeJS 没有足够的经验,在我看来,为简单的 bool 函数定义一个 Promise 有点棘手。

【问题讨论】:

    标签: javascript node.js promise es6-promise


    【解决方案1】:

    好吧,你可以做的是循环查找哪些项目不在 db 中,然后用Promise.all 插入所有项目。 会是这样的:

    const itemsNotSaved = items.filter((item) => {
           //Check if item is in db already.
           //If it is, return false, if not, true
    });
    
    const itemsPromises = itemsNotSaved.map((item) => {
      //Create a new promise for inserting item
    });
    
    //Execute every Promise
    Promise.all(itemsPromises)
    .then((items) => {
     //No errors, items have been inserted in the database
    })
    .catch((error) => {
     //console.log(error);
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多