使用Promises链实现详细的睡眠功能

时间:2019-01-01 11:44:08

标签: javascript promise sleep chaining

我正在尝试使用JavaScript中的Promises实现睡眠功能。

const {DynamoDB} = require('@aws-sdk/client-dynamodb-v2-node');
async function example() {
        const client = new DynamoDB({region: 'ap-southeast-1'});
        try {
                var params = { TableName : 'events', Key: { key: { S: 'wow' } } };
                const results = await client.getItem(params);
                console.log(results);
        } catch (err) {
                console.error(err);
        }
}
example();

,并且有效。但是

function sleep(ms) {

  var begin = new Promise(resolve => {
    console.log("Sleep function called for " + ms + " ms\n")
  });

  return new Promise(resolve => setTimeout(resolve, ms))
    .then(() => console.log("Sleep done!" ));

}

没有,而是挂了!是什么赋予了?

更新:我真正想做的是将其写出为一个promise调用序列。

function sleep(ms) {

  var begin = new Promise(resolve => {
    console.log("Sleep function called for " + ms + " ms\n")
  });

  return begin.then(resolve => setTimeout(resolve, ms))
    .then(() => console.log("Sleep done!" ));

}

2 个答案:

答案 0 :(得分:1)

在第二个片段中,您需要立即解决begin

var begin = new Promise(resolve => {
  console.log("Sleep function called for " + ms + " ms\n")
  resolve()
})

它在第一个代码段中起作用的原因是,因为您从不依靠begin来完成,而只是在那里记录开始。但这不是您想要的方式。立即解决Promise是没有意义的(无论如何都不适合您的用例)。因此,您应该执行以下操作:

function sleep(ms) {
  console.log("Sleep function called for " + ms + " ms\n")

  return new Promise(resolve => {
    setTimeout(() => {
      console.log("Sleep done!")
      resolve()
    }, ms)
  })
}

答案 1 :(得分:1)

如果要撰写两个承诺,则可以在传递给第一个承诺的Promise.prototype.then的回调中返回第二个承诺。

看看下面的代码:

const sleep = ms => () => new Promise((resolve, reject) => window.setTimeout(resolve, ms));

Promise.resolve()
.then(() => { console.log('A1');})
.then(sleep(2000))
.then(() => {console.log('A2');});

Promise.resolve()
.then(() => {console.log('B1');})
.then(sleep(1000))
.then(() => {console.log('B2');});

sleep函数是一个高阶函数,它返回另一个返回诺言的函数。通过传递给Window.setTimeout的{​​{1}}参数化对ms的调用,可以解决此承诺。

如您所见,执行是交错的,在第一个承诺的sleep的输出之前,您将看到第二个承诺的语句console.log('B2')的日志输出。