我有一个foo发出Ajax请求的函数.我怎样才能从中回复foo?
我尝试从success回调中返回值,并将响应分配给函数内部的局部变量并返回该变量,但这些方法都没有实际返回响应.
function foo() {
var result;
$.ajax({
url: '...',
success: function(response) {
result = response;
// return response; // <- I tried that one as well
}
});
return result;
}
var result = foo(); // It always ends up being `undefined`.
Run Code Online (Sandbox Code Playgroud) 我编写的代码看起来像:
function getStuffDone(param) { | function getStuffDone(param) {
var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) {
// or = new $.Deferred() etc. | // using a promise constructor
myPromiseFn(param+1) | myPromiseFn(param+1)
.then(function(val) { /* or .done */ | .then(function(val) {
d.resolve(val); | resolve(val);
}).catch(function(err) { /* .fail */ | }).catch(function(err) {
d.reject(err); | reject(err);
}); | });
return d.promise; /* or promise() */ | });
} | }
Run Code Online (Sandbox Code Playgroud)
有人告诉我这个被称为" 延迟反模式 "或" Promise构造函数反模式 ",这个代码有什么不好,为什么这被称为 …
我试图使用setTimeout来检查表中是否存在数据:
如果数据存在则不获取数据.如果数据不存在,则使用load获取数据,然后每隔x分钟执行相同的操作.
这是我到目前为止所拥有的.出于某种原因,setTimeout当它命中If块时不起作用.
我甚至不确定这是否是最好的方法.
var sTimeOut = setTimeout(function () {
$.ajax({
url: 'CheckIfDataExists/' +
new Date().getTime(),
success: function (response) {
if (response == 'True') {
$('.DataDiv')
.load('GetFreshData/' + new Date()
.getTime(), { "Id": $("#RowID").val() });
}
},
complete: function () {
clearTimeout(sTimeOut);
}
});
}, 10000);
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
更新 ...
setTimeout(function(){checkData()}, 5000);
function checkData(){
$.ajax({
url: 'CheckIfDataExists/' +
new Date().getTime(),
success: function (response) {
if (response == 'True') {
$('.DataDiv')
.load('GetFreshData/' + new Date()
.getTime(), { "Id": $("#RowID").val() }); …Run Code Online (Sandbox Code Playgroud) 我知道它在这里被多次询问,很多次回答这不是应该怎么做的方式,而是再一次:)
是否有可能以某种方式调用异步函数(例如timer/ajax调用),基本上是常见的异步任务并同步等到它结束而没有100%的CPU使用率并阻止浏览器?
简单的回答就足够了 - 是或否.如果没有我必须根据"异步方式"中的异步操作编写所有代码,否则,它会更好;)
想象一下:
updateCSS("someurl.css")
function updateCSS(url) {
var css = getCachedResource(url);
css = css.replace(/regexp/gm, function(curUrl) {
base64 = atob(getCachedResource(curUrl))
return "data:image;base64," + base64
})
}
function getCachedResource(url) {
//...
if (cached) {
return cached
} else {
// doajax...
// watfor
return loaded
}
}Run Code Online (Sandbox Code Playgroud)
当然,我可以使它异步,但代码将......非常糟糕.而且,我必须使调用此函数的所有函数都异步.你能看到简单的解决方案吗 我会说阻塞是最简单的.
谢谢
我见过很多关于新EMCA承诺的教程,主张避免jQuery库中的"promises".他们通常说你可以通过做这样的事情来躲避他们:
Promise.resolve($.getJSON(url, params)); // voila! the jQuery promise is "gone"!
Run Code Online (Sandbox Code Playgroud)
但是,当我必须将两个异步jQuery函数链接在一起时,这并不真正起作用.如何在不使用jQuery的then()或.when()的情况下将两个getJSON调用(第二个调用依赖于第一个调用)链接在一起?
相反,我只想使用Promise.all等.
我认为一个类似的问题问题是交叉jquery和EMCA的承诺?
我有搜索具有特定类的每个元素的函数:
$("#stepSurveyCtnId .questionCtnClass").each(function () {}
Run Code Online (Sandbox Code Playgroud)
在每个步骤中,我检查一个问题是否是客户类型:
var type = $(this).children().data("question-type");
var isCustomerQuestion = false;
switch (type) {
case "Name":
case "Email":
isCustomerQuestion = true;
break;
}
Run Code Online (Sandbox Code Playgroud)
如果是客户类型,我从数据库中获取客户表的下一个ID:
if(isCustomerQuestion) {
if (customerId == -1) {
$.ajax({
method: "POST",
url: urlCustomerCreate,
success: function (ajaxData) {
customerId = ajaxData.NumericValue;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
问题是在.each()函数的第二次迭代中,customerId仍然是= -1,例如它应该是1305.
似乎执行不会在$ .ajax调用中停止,或者迭代在同一时间执行,第二次迭代不会从第一次迭代中接收customerId.
javascript ×6
jquery ×4
promise ×3
asynchronous ×2
es6-promise ×2
ajax ×1
async-await ×1
bluebird ×1
q ×1