我正在尝试使用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!" ));
}
答案 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')
的日志输出。