javascript - 使用 `Promise.resolve` 订购多功能

标签 javascript node.js

我有 3 个函数,每个函数都单独使用 Promise.resolve
如何使用 Promise.resolve For All?,当我调用所有函数时,这些函数没有排序

function sendAllText(msg, opts) {
   if (locale.keyboards[msg.text].text) {
      var i,j,tempstring, promise;
      promise = Promise.resolve();
      for (i=0,j=locale.keyboards[msg.text].text.length; i<j; i++) {
          tempstring = locale.keyboards[msg.text].text[i];
          promise = promise.then(bot.sendMessage.bind(bot,msg.chat.id, tempstring, opts));
      }
   }
}
function sendAllPhoto(msg, opts) {
   if (locale.keyboards[msg.text].photo) {
      var i,j,tempstring, promise;
      promise = Promise.resolve();
      for (i=0,j=locale.keyboards[msg.text].photo.length; i<j; i++) {
          tempstring = locale.keyboards[msg.text].photo[i];
          promise = promise.then(bot.sendPhoto.bind(bot,msg.chat.id, tempstring, opts));
      }
   }
}

function sendAllVideo(msg, opts) {
   if (locale.keyboards[msg.text].video) {
      var i,j,tempstring, promise;
      promise = Promise.resolve();
      for (i=0,j=locale.keyboards[msg.text].video.length; i<j; i++) {
          tempstring = locale.keyboards[msg.text].video[i];
          promise = promise.then(bot.sendVideo.bind(bot,msg.chat.id, tempstring, opts));
      }
   }
}

当我调用函数时,我的数据未排序,我正在使用 Node telegram bot Api

bot.onText(/\/love/, function onLoveText(msg) {
  const opts = {
    reply_to_message_id: msg.message_id,
    reply_markup: JSON.stringify({
      keyboard: [
        ['Yes, you are the bot of my life ❤'],
        ['No, sorry there is another one...']
      ]
    })
  };
  sendAllText(msg, opts);
  sendAllPhoto(msg, opts);
  sendAllVideo(msg, opts); 
});

最佳答案

在三个函数的末尾,在它们的循环之后,添加:

return promise;

还要确保在函数开头定义 Promise 变量,这样当 if 条件不成立时也会定义它。

例如,在第一个函数中:

function sendAllText(msg, opts) {
   var promise = Promise.resolve(); // <----
   if (locale.keyboards[msg.text].text) {
      var i,j,tempstring;
      for (i=0,j=locale.keyboards[msg.text].text.length; i<j; i++) {
          tempstring = locale.keyboards[msg.text].text[i];
          promise = promise.then(bot.sendMessage.bind(bot,msg.chat.id, tempstring, opts));
      }
   }
   return promise; // <-----
}

然后在最后一段代码中,链接你的 promise :

sendAllText(msg, opts)
    .then(sendAllPhoto.bind(null, msg, opts))
    .then(sendAllVideo.bind(null, msg, opts)); 

关于javascript - 使用 `Promise.resolve` 订购多功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43625497/

相关文章:

javascript - 表单提交后可能的 HTTP 请求状态

node.js - 我想升级 Node 环回应用程序中的所有 npm 包

javascript - Node.js:创建了存储在变量中的 xlsx 文件,但不确定如何保存它

node.js - 如何克隆 Mongoose 模式?

node.js - AWS Lambda 和 Twitter 流

javascript - Javascript/OOJS 中的子类化

javascript - 单击将两个类添加到不同的元素

mysql - 如何使用express-session和express-mysql-session创建登录端点

javascript - 元素添加到 DOM 时触发事件 : JQuery Livequery Equivalent in 1. 7

javascript - 如何在没有本地服务器的情况下设置 Google Drive 客户端 ID 以进行访问?