我有这样的功能:
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改进我的代码?
我想在浏览器扩展中使用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 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) 总结: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) 我正在学习 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) 我有这样一个函数,它创建一个写流,然后将字符串数组写入文件.写完后,我想让它返回一个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)
谢谢你的评论!
我正在尝试将我的一些代码转换为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)
显然它不起作用,什么也没印刷
我想实现类似任务运行程序的东西,它将被推送新任务。这些任务中的每一个都可以是一些异步操作,例如等待用户或进行 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 队列。但任务本身并不是承诺,所以我不知道如何检查这些任务是否完成。
无论如何,我需要正确的方法。
是否可以创建一个 Promise 来在全局 vuex 存储中的变量发生更改时进行解析?
我有一个null在状态存储中初始化的变量,并将通过异步调用填充。
应用程序的不同部分取决于该变量是true或false并且应该在它静止时等待null。
有没有办法干净地等待这个变量的变化?
我正在尝试使用异步/等待代码读取文件。这是我的代码:
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之前读取。我在哪里做错了?
javascript ×9
promise ×8
node.js ×4
ecmascript-6 ×3
async-await ×2
callback ×2
es6-promise ×2
asynchronous ×1
fetch-api ×1
fs ×1
hash ×1
q ×1
typescript ×1
vue.js ×1
vuejs2 ×1
vuex ×1