相关疑难解决方法(0)

如何将函数调用与两个回调转换为promise

我有这样的功能:

var f = function(options, successCallback, errorCallback) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我想把它转换成一个承诺.我目前的解决方案是:

var deferred = Q.defer();

f(options,
    function (result) {
        deferred.resolve(result);
    }, function (err) {
        deferred.reject(err);
    }
);

return deferred.promise;
Run Code Online (Sandbox Code Playgroud)

我不能使用Q.fcall,因为它需要一个Node.js样式的回调 function(err, result) { ... }

那么,有没有办法使用Q API改进我的代码?

javascript node.js promise q

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

获取资源,计算哈希,返回承诺

我想在浏览器扩展中使用Fetch API来下载资源并计算其哈希值.以下作品(通过Browserify使用加密)

fetch(url).then(function(response) {
  return response.blob();
}).then(function(data) {
  var a = new FileReader();
  a.readAsBinaryString(data);
  a.onloadend = function() {
    var hash = crypto.createHash(hashType);
    hash.update(a.result, 'binary');
    return hash.digest('hex');
  };
})
Run Code Online (Sandbox Code Playgroud)

但有一个缺点,我必须等待,a.onloadend而我想要嵌入它的上下文需要Promise返回.此外,首先获取整个blob似乎很奇怪,然后将其读入一个FileReaderjust以便将其转储到createHash之后.

任何提示?

javascript hash promise fetch-api

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

为什么 JavaScript Promise 然后处理程序在其他代码之后运行?

我只是想提高我对 JavaScript Promises 工作原理的理解。我创造了以下情况:

LOG 'FOO'
RUN CALLBACK LOGGING 'CALLBACK'
LOG 'BAR'
Run Code Online (Sandbox Code Playgroud)

期望所有功能立即完成(我的意思是它们不会花费过多/未知的时间来完成,您将使用异步操作来完成)以便上述操作顺序将按该顺序发生。

您可以通过以下方式编写:

function foo(cb) {
  // LOG 'FOO'
  console.log('foo');
  // RUN CALLBACK
  cb();
}

function callback() {
  // LOG 'CALLBACK'
  console.log('callback');
}

foo(callback);

console.log('bar');
Run Code Online (Sandbox Code Playgroud)

这会根据我在开始时指定的情况产生预期的输出。

> foo
> callback
> bar
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式编写它:

function foo() {
  return new Promise((resolve) => {
    // LOG 'FOO'
    console.log('foo');
    return resolve(null);
  });
}

function callback() {
  // LOG 'CALLBACK'
  console.log('callback');
}

foo().then(callback);

// LOG 'BAR'
console.log('bar');
Run Code Online (Sandbox Code Playgroud)

这种情况会产生以下结果:

> foo …
Run Code Online (Sandbox Code Playgroud)

javascript promise ecmascript-6 es6-promise

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

如何让`.then()`保持足够长的时间来使用本机承诺的轮询功能?

总结:poll()具有回调函数可用; 我没有找到任何使用本机承诺.我试图适应一些没有成功.我还没有解决的问题是,当setTimeout调用的函数的第一个实例结束而没有任何返回时,.then()监听它会将终止视为a false和a reject().then()终止并且不听取以后的回报.

问题:如何最好地帮助.then()功能留下来以后用resolve()或返回reject()

这篇文章的其余部分是详细的.阅读有用的内容.

可用的轮询功能:我喜欢(/sf/users/87445361/)Om Shankar 每60秒调用一次函数的响应.David Walsh的民意调查()非常相似(在https://davidwalsh.name/essential-javascript-functions).两者都使用回调并且运行良好.我在javascript 中发现 一个包含poll()使用bluebird-only promises的民意调查.

这是我尝试用本机承诺实现的.

/**
 * poll - checks repeatedly whether a condition exists. When the condition
 *   exists, returns a resolved standard promise. When it has checked
 *   long enough, returns a rejected standard promise.
 * @param {function} fn - a caller-supplied synchronous …
Run Code Online (Sandbox Code Playgroud)

javascript callback promise

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

如何在 ES6 中将回调代码转换为 Promise

我正在学习 ES6 标准,所以我从一个非常基本的示例代码开始。

JavaScript 中存在回调地狱,所以这次我确实想避免使用回调。但我遇到了一个问题,我真的不知道如何将回调样式代码转换为承诺。

例如,如果我有这样的代码如下所示

module.exports = (x, y, callback) => {
  try {
    if (x < 0 || y < 0) {
      throw new Error('Rectangle dimensions are wrong.');
    } else {
      callback(null, {
        perimeter() {
          return (2 * (x + y));
        },
        area() {
          return (x * y);
        },
      });
    }
  } catch (error) {
    callback(error, null);
  }
};
Run Code Online (Sandbox Code Playgroud)

ES6 中如何将其转换为 a Promise?这是一种将回调转换为承诺的推荐行为吗?

我已经读过这个例子,但实际上我对结果感到困惑。我认为在开始重写对 Promise 的回调之前,我需要首先了解这一点。

let promise = new Promise(function(resolve, reject) {
  console.log('Promise');
  resolve();
});

promise.then(function() …
Run Code Online (Sandbox Code Playgroud)

javascript asynchronous callback promise ecmascript-6

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

如何在writestream完成时返回一个promise?

我有这样一个函数,它创建一个写流,然后将字符串数组写入文件.写完后,我想让它返回一个Promise.但我不知道如何才能做到这一点.

function writeToFile(filePath: string, arr: string[]): Promise<boolean> {
   const file = fs.createWriteStream(filePath);
   arr.forEach(function(row) {
     file.write(row + "\n");
   });
   file.end();
   file.on("finish", ()=>{ /*do something to return a promise but I don't know how*/});
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的评论!

javascript fs node.js promise typescript

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

ES6承诺超时间隔

我正在尝试将我的一些代码转换为Promise,但是我不知道如何在Promise中链接一个新的Promise。

我的promise函数应该每隔一秒左右检查一次数组的内容,并且其中是否应该解析任何项目。否则,应等待1秒钟,然后再次检查,依此类推。

function get(){
    return new Promise((resolve) => {

      if(c.length > 0){
        resolve(c.shift());

      }else{
        setTimeout(get.bind(this), 1000);
      }

    });

}


let c = [];

setTimeout(function(){
  c.push('test');
}, 2000);
Run Code Online (Sandbox Code Playgroud)

这就是我期望我的get()承诺函数正常工作的方式,它应该在最多2或3秒后打印“ test”:

get().then((value) => {
  console.log(value);
});
Run Code Online (Sandbox Code Playgroud)

显然它不起作用,什么也没印刷

javascript node.js promise

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

带有等待功能的 JavaScript 简单任务运行程序

我想实现类似任务运行程序的东西,它将被推送新任务。这些任务中的每一个都可以是一些异步操作,例如等待用户或进行 API 调用或其他操作。任务运行程序确保一次只能执行允许数量的任务,而其他任务将继续等待,直到轮到它们。

class Runner {
  constructor(concurrent) {
    this.taskQueue = []; //this should have "concurrent" number of tasks running at any given time

  }

  push(task) {
    /* pushes to the queue and then runs the whole queue */
  }
}
Run Code Online (Sandbox Code Playgroud)

调用模式是

let runner = new Runner(3);
runner.push(task1);
runner.push(task2);
runner.push(task3);
runner.push(task4);
Run Code Online (Sandbox Code Playgroud)

其中任务是一个函数引用,它将在最后运行一个回调,我们可以知道它已完成。所以它应该像

let task = function(callback) {
  /* does something which is waiting on IO or network or something else*/
  callback(); 
}
Run Code Online (Sandbox Code Playgroud)

所以我正在推动跑步者的关闭,比如

runner.push(function(){return task(callback);});
Run Code Online (Sandbox Code Playgroud)

我想我可能还需要添加一个 waitList 队列。但任务本身并不是承诺,所以我不知道如何检查这些任务是否完成。

无论如何,我需要正确的方法。

javascript async-await ecmascript-6 es6-promise

5
推荐指数
2
解决办法
4441
查看次数

VueJS Vuex - 解决状态变化的承诺?

是否可以创建一个 Promise 来在全局 vuex 存储中的变量发生更改时进行解析?

我有一个null在状态存储中初始化的变量,并将通过异步调用填充。
应用程序的不同部分取决于该变量是truefalse并且应该在它静止时等待null

有没有办法干净地等待这个变量的变化?

javascript promise vue.js vuex vuejs2

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

Node.js使用async / await读取文件

我正在尝试使用异步/等待代码读取文件。这是我的代码:

var fs = require('fs');

function readFile(fileName) {
  return new Promise(resolve => {
    //console.log(test);
    fs.readFile(fileName, 'utf8', function (err, data) {
      if (err) throw err;

      console.log(fileName)
      console.log(data)
    })
    resolve();
  });
}

async function run() {
  await readFile('file1.txt');
  await readFile('file2.txt');
  readFile('file3.txt');
}

run();
Run Code Online (Sandbox Code Playgroud)

但是结果仍然是随机的。这意味着file3有时会在file2之前读取。我在哪里做错了?

node.js async-await

5
推荐指数
2
解决办法
5267
查看次数