相关疑难解决方法(0)

是否可以将异步函数传递给 setImmediate 以异步调用任意函数?

我想异步调用给定的函数。包装函数 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)

注意:https://www.youtube.com/watch? v=e3Nh350b6S4

node.js promise

5
推荐指数
1
解决办法
725
查看次数

不能从异步承诺执行程序函数中抛出错误

我一直试图理解为什么下面的代码没有抓住它throw.如果asyncnew 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不在这里工作.谢谢!

javascript node.js promise async-await

4
推荐指数
2
解决办法
1916
查看次数

如何从函数中多次产生价值?

所以我正在做的是,我有 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以便我继续解析令牌。但它没有,有没有办法直接导出变量,这样任务会更容易?

javascript generator promise

4
推荐指数
1
解决办法
147
查看次数

如何使用节点的 child_process.exec() 和 promise

我尝试使用 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。在这两种情况下。该命令在命令行上运行得很好。

为什么会立即返回?

exec child-process node.js

3
推荐指数
1
解决办法
5881
查看次数

会在promise循环中解决break循环迭代吗?

我在这样的循环中调用异步函数(例如上传文件列表):

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;循环调用吗?

javascript promise es6-promise

3
推荐指数
1
解决办法
2035
查看次数

如何在 JavaScript 中延迟重试异步函数?

我正在尝试从数据库中获取记录。由于竞争条件,当我第一次尝试获取记录时,记录可能甚至可能不存在。我如何将其包装在重试逻辑中而不发疯?我似乎太愚蠢了

  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)

javascript node.js promise async-await

2
推荐指数
1
解决办法
3663
查看次数

for循环中的“await仅在异步函数中有效”

我被告知“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 循环吗?如果是这样,如何在没有此错误的情况下获得预期结果?

javascript node.js promise async-await

1
推荐指数
1
解决办法
164
查看次数