我想异步调用给定的函数。包装函数 tryCallAsync 是执行此操作的一种方法。这种方法有效。但是,它要求 setImmediate 的回调是异步函数。这似乎是错误的,因为回调返回了一个未使用的 Promise。为此目的将异步函数传递给 setImmediate 是否错误?
async function tryCallAsync(fn, ...args) {
return new Promise((r, j) => {
setImmediate(async () => {
try {
r(await fn(...args));
}
catch (e) {
j(e);
}
})
})
}
// Using tryCallAsync
let resolveAsync = tryCallAsync(()=>{
return new Promise((r,j)=>{
setImmediate(()=>r('resolveAsync'));
});
})
resolveAsync.then((resolve)=>console.log(resolve));
let resolve = tryCallAsync(()=>{
return 'resolve';
});
resolve.then((resolve)=>console.log(resolve));
Run Code Online (Sandbox Code Playgroud)
我一直试图理解为什么下面的代码没有抓住它throw.如果async从new Promise(async (resolve, ...部件中删除关键字,那么它可以正常工作,因此它与Promise执行程序是异步函数的事实有关.
(async function() {
try {
await fn();
} catch(e) {
console.log("CAUGHT fn error -->",e)
}
})();
function fn() {
return new Promise(async (resolve, reject) => {
// ...
throw new Error("<<fn error>>");
// ...
});
}
Run Code Online (Sandbox Code Playgroud)
这里的答案,这里和这里重复一遍"如果你在任何其他异步回调中,你必须使用reject",但是"异步"它们并不是指async函数,所以我认为它们的解释不适用于此(如果他们这样做,我不明白如何).
如果不是throw我们使用reject,上面的代码工作正常.从根本上说,我想明白为什么throw不在这里工作.谢谢!
所以我正在做的是,我有 2 个文件,一个包含一个脚本,可以生成一个令牌,第二个文件处理该令牌。
问题在于,记录令牌的第二个脚本只会记录收到的第一个令牌。
这是我处理令牌的方式:
const first_file = require("./first_file.js");
first_file.first_file().then((res) => {
console.log(res);
});
Run Code Online (Sandbox Code Playgroud)
显然这是行不通的,因为它没有用更新的值更新。
first_file = async () => {
return new Promise(async (resolve, reject) => {
//Generating the token
(async () => {
while (true) {
console.log("Resolving...");
resolve(token);
await sleep(5000);
resolved_token = token;
}
})();
});
};
module.exports = { first_file };
Run Code Online (Sandbox Code Playgroud)
我在这里做的是,我尝试做一个,while..loop以便我继续解析令牌。但它没有,有没有办法直接导出变量,这样任务会更容易?
我尝试使用 node.js(docker exec 命令)按顺序执行长进程。
我愿意:
const childProcess = require('child_process');
const execWithPromise = async command => {
return new Promise(async resolve => {
const process = childProcess.exec(command);
process.on('exit', err => resolve(err));
process.on('close', err => resolve(err));
});
};
const run = async () => {
await execWithPromise('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
await execWithPromise('/usr/local/bin/docker exec -i -t cucumber node long-running-script.js');
};
run();
Run Code Online (Sandbox Code Playgroud)
但是承诺立即得到解决,结果为 1。在这两种情况下。该命令在命令行上运行得很好。
为什么会立即返回?
我在这样的循环中调用异步函数(例如上传文件列表):
return new Promise(async function(resolve, reject) {
for (let i = 0; i < list.length; i++) {
let response = await myAsyncFunction();
if (response.ok === false) {
resolve({error: "Something goes wrong"});
// break; - is this required?
}
}
}
async function myAsyncFunction() {
return new Promise(async function(resolve, reject) {
resolve code....
}
}
Run Code Online (Sandbox Code Playgroud)
如果在一个也在承诺中的循环中,我调用resolve()将循环继续迭代,否则它将停止在那里。
基本上,如果我在此之前解决,我需要break;循环调用吗?
我正在尝试从数据库中获取记录。由于竞争条件,当我第一次尝试获取记录时,记录可能甚至可能不存在。我如何将其包装在重试逻辑中而不发疯?我似乎太愚蠢了
const booking = await strapi.query("api::booking.booking").findOne({
where: {
id: id,
},
});
Run Code Online (Sandbox Code Playgroud)
此代码应n延迟几t毫秒重试。谢谢并充满爱意。
我尝试过的:
async function tryFetchBooking(
id,
max_retries = 3,
current_try = 0,
promise
) {
promise = promise || new Promise();
// try doing the important thing
const booking = await strapi.query("api::booking.booking").findOne({
where: {
id: id,
},
});
if (!booking) {
if (current_try < max_retries) {
console.log("No booking. Retrying");
setTimeout(function () {
tryFetchBooking(id, max_retries, current_try + 1, promise);
}, 500);
} else {
console.log("No …Run Code Online (Sandbox Code Playgroud) 我被告知“await 仅在异步函数中有效”,即使它在异步函数中。这是我的代码:
async function uploadMultipleFiles (storageFilePaths,packFilePaths,packRoot) {
return new Promise((resolve,reject) => {
try {
for (i in storageFilePaths) {
await uploadFile(storageFilePaths[i],packFilePaths[i],packRoot) // error throws on this line
}
resolve("files uploaded")
} catch {
console.log(err)
reject("fail")
}
})
}
Run Code Online (Sandbox Code Playgroud)
为什么在我将其设为异步函数时会发生这种情况?是因为我使用了 for 循环吗?如果是这样,如何在没有此错误的情况下获得预期结果?