所以我想通过尝试使用nodejs来实现一个常见的用例来了解更多有关Promises的信息(我随意选择了Bluebird,尽管有简洁的'文档):
我在文件中有大约9000个左右的URL,还有一些空行。我想:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("customCell", forIndexPath: indexPath) as! CustomCell
cell.customCellDescription.text = data[indexPath.row]
return cell
}
模块的HEAD请求)request
第一个过滤器很容易,因为它立即返回(这里使用Bluebird):
dns.resolve()
但是如何将异步头请求的结果反馈回Promise?这是另一个更完整的例子,说明我在哪里撞墙(见内联评论):
Promise.each(urls, function(value, index, length) {
return value.length > 0;
}).then(
console.log(urls);
);
对于我计划修改的<pre class="prettyprint lang-js">
var Promise = require('bluebird'),
request = Promise.promisifyAll(require('request'));
var urls = ["", "https://google.com/", "http://www.nonexistent.url"];
var checkLength = function(url) {
return Promise.resolve(url.length > 0);
}
var checkHead = function(url) {
return Promise.resolve(
// ??? seee below for an 'unPromised' function that works on its own
)
}
var logit = function(value) {
console.log((urls.length - value.length) + " empty line(s)");
}
Promise
.filter(urls, checkLength)
// and here? .filter(urls, checkHead) ? I don't think this would work.
// and I haven't even look at the map functions yet, although I guess
// that once I've understood the basic filter, map should be similar.
.then(logit);
</pre>
函数:
checkHead
我不想抱怨,我仍然拼命寻找一些好的教程介绍材料,让那些不熟悉Promise的开发人员亲自动手,并展示常见用例的实际实现,类似于cookbook。如果有的话,我很乐意得到一些指示。
答案 0 :(得分:1)
过滤器和贴图函数的工作方式类似于JavaScript数组的默认函数。
之前我曾使用过prom的请求,并且只有一个特定的模块用于此请求 - 承诺。它可能更方便。
我觉得请求承诺模块非常适合展示Promise是如何伟大的。
而不是陷入回调地狱,而每次添加的请求都会更深入,你可以使用promises来代替这个
rp(login)
.then(function(body) {
return rp(profile);
})
.then(function(body) {
return rp(profile_settings);
})
.then(function(body) {
return rp(logout);
})
.catch(function(err) {
// the procedure failed
console.error(err);
});
我将您当前的代码改写为此
var Promise = require("bluebird");
var rp = require("request-promise");
var urls = ["", "https://google.com/", "http://www.nonexistent.url"];
Promise
// checkLength
.filter(urls, function(url){return url.length > 0})
.then(function(list) {
// logit
console.log((urls.length - list.length) + " empty line(s)");
// checkHead
return Promise.filter(list, function(url) {
// using request-promise and getting full response
return rp.head({ uri: url, resolveWithFullResponse: true })
.promise().then(function(response) {
// only statusCode 200 is ok
return response.statusCode === 200;
})
.catch(function(){
// all other statuscodes incl. the
// errorcodes are considered invalid
return false;
});
})
})
.then(console.log);