我真的很喜欢jQuery延迟/承诺模式或范例的想法,但有时候我很难将我老化的大脑包裹在更精细的点或具体的实现细节之外.
事实上,最近我发现deferred/promise模式/范例似乎早于jQuery,并且至少在其他JavaScript库/框架中:
我可能错过了一些,其中包含其他一些内容的东西,并在该列表中犯了其他错误...请编辑它以纠正它或发表评论.
"Q"是否发明了延迟/承诺概念?它是用其他JavaScript库或框架发明的吗?还是它完全早于JavaScript?
如果整个想法传统上是函数式编程的一部分,它首先在哪里完成,我在哪里可以阅读有关概念而不是这些各种不同的JavaScript实现?
或者功能性编程完全不是重点?概念是否与并发编程相关而不是与函数式编程相关?
我正在尝试重写模块以返回与以前不同的值,但现在它使用异步调用来获取该值.(child_process如果重要的话).我把它包装在Promise中,但这对我来说并不重要 - 它可以在原始的child_process回调中,但问题是我无法将承诺链接到应用程序中的任何地方,因为我需要这个变为同步.这是我的模块:
exec = require('child_process').exec
platformHome = process.env[if process.platform is 'win32' then 'USERPROFILE' else 'HOME']
getExecPath = new Promise (resolve, reject) ->
path = process.env.GEM_HOME
if path
resolve(path)
else
exec 'gem environment', (err, stdout, stderr) ->
unless err
line = stdout.split(/\r?\n/)
.find((l) -> ~l.indexOf('EXECUTABLE DIRECTORY'))
if line
resolve line[line.indexOf(': ') + 2..]
else
reject undefined
GEM_HOME = undefined
getExecPath.then (path) ->
GEM_HOME = path
.catch ->
GEM_HOME = "#{platformHome}/.gem/ruby/2.3.0"
.then =>
module.exports = GEM_HOME // or simply …Run Code Online (Sandbox Code Playgroud) 代码示例:http://jsfiddle.net/MhEPw/1/
我有两个jQuery Deferred对象.
我希望发生多个"异步"请求 - 并且在它们全部运行之后我希望回调(.done函数)按照指定的顺序运行.不幸的是它们不按顺序运行.
也许我正在寻找Deferred不提供的一些功能?
我无法使用AJAX将结果显示在Select2中.这是我的代码:
$(document).ready(function() {
$("#producto").select2({
placeholder: 'Select a product',
formatResult: productFormatResult,
formatSelection: productFormatSelection,
dropdownClass: 'bigdrop',
escapeMarkup: function(m) { return m; },
minimumInputLength:3,
ajax: {
url: 'http://foo.foo/listar.json',
dataType: 'jsonp',
data: function(term, page) {
return {
q: term
};
},
results: function(data, page) {
return {results:data};
}
}
});
function productFormatResult(product) {
var html = "<table class='product-resultado'><tr>";
if(product.img != undefined) {
html += "<td class='product-image'><img src='"+product.img+"'/></td>";
}
html += "<td class='product-info'>";
html += product.text + "<br />";
html += product.precio_costo + " CRC …Run Code Online (Sandbox Code Playgroud) 像这样读JSON-Service:
$.ajax({
url:'activeIDs',
success : function(data){ // data = [14,15]
var tableRows = [];
for (var dataIndex=0; dataIndex < data.length; dataIndex++) {
var isLast = dataIndex == (data.length - 1);
$.ajax({
url: 'info?id=' + data[dataIndex],
success: function(data2) { // "foo", "bar"
tableRows.push(data2.name);
if (isLast) {
alert(tableRows.length);
}
}
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
第一个网络跟踪是:
[14,15]"foo""bar"在这种情况下,警报给出"2".
秒网络跟踪是不同的:
[14,15];"foo"(现在需要很长时间)"bar"在这种情况下警报提供 …
我有一个用其他对象调用的函数,当我的应用程序被加载时,获取参数,函数应该等待所有对象的调用,然后使用promises模式执行,我可以确保所有对象都已加载但我不知道对象的数量,我不希望设置超时加载.我不谈论特定的技术,如jquery需要算法.
伪代码:
function loadWidget(id){
list.push(id);
//here I should ensure all Widget is loaded
}
Run Code Online (Sandbox Code Playgroud)
在其他应用程序我打电话
app.loadWidget.add(widget1.id);
.
.
.
app.loadWidget.add(widget2.id);
Run Code Online (Sandbox Code Playgroud) 我写了以下node.js文件:
var csv = require('csv-parser');
var fs = require('fs')
var Promise = require('bluebird');
var filename = "devices.csv";
var devices;
Promise.all(read_csv_file("devices.csv"), read_csv_file("bugs.csv")).then(function(result) {
console.log(result);
});
function read_csv_file(filename) {
return new Promise(function (resolve, reject) {
var result = []
fs.createReadStream(filename)
.pipe(csv())
.on('data', function (data) {
result.push(data)
}).on('end', function () {
resolve(result);
});
})
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我用Promise.all它来等待读取csv文件的两个操作.我不明白为什么,但是当我运行代码时,该行'console.log(result)'未提交.
我的第二个问题是我希望回调函数Promise.all.then()接受两个不同的变量,而其中每个变量都是相关承诺的结果.
可能重复:
jQuery:在ajax调用成功后返回数据
我有一个问题,让这个ajax功能工作,不知道我搞砸了.
var getTotalEntries = function(query) {
var total;
$.ajax({
url: url,
data: query,
dataType: 'jsonp',
success: function(data) {
console.log(data.total);
total = data.total;
}
});
return total;
};
Run Code Online (Sandbox Code Playgroud)
这会将65记录到控制台,但返回undefined ...不确定发生了什么.
我有以下几点:
new Promise(resolve => setTimeout(resolve, 2000))
.then(() => console.log("after 2 seconds"));
new Promise(resolve => setTimeout(resolve, 3000))
.then(console.log("before 3 seconds (instantly)"));
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
> node index.js
before 3 seconds (instantly)
after 2 seconds
Run Code Online (Sandbox Code Playgroud)
Promise.then()需要一个onFulfilled函数,但我传入的console.log("before 2 seconds (instantly)")不是函数。两部分问题:
console.log("before 2 seconds (instantly)")会立即执行(或根本执行)?可能重复:
jQuery:在ajax调用成功后返回数据
我写了一个脚本,在里面用一个select字段添加一个新的div容器.select字段的数据之前加载了ajax请求.但由于某种原因,只有当我使用alert()输出内容时,这些字段才可见.
var o = '';
$.ajax({
type: 'post',
dataType: 'json',
url: webroot + 'items',
success: function(data) {
$.each(data, function(index, value) {
o += '<option value="' + index + '">' + value + '</option>';
});
}
});
var l = parseInt($('.items .item').length);
var h = '<div class="item"><span class="bold">Item ' + (l + 1) + '</span><select id="ItemName" name="data[Item][name]">' + o + '</select></div>';
Run Code Online (Sandbox Code Playgroud)
我实际上不知道如何解决这个问题.你能帮助我吗?
javascript ×9
ajax ×4
jquery ×4
node.js ×3
promise ×3
algorithm ×1
asynchronous ×1
bluebird ×1
coffeescript ×1
deferred ×1
ecmascript-6 ×1
history ×1
jsonp ×1