我有一个函数数组,它们返回名为phoneAjaxCalls
的jQuery延迟AJAX对象。我的代码将多次调用推送到一个名为newPhone
的函数,该函数接受两个参数。
function newPhone(tlcPhone, studentsdcid) {
//Create new email
return $j.ajax({
type: 'POST',
url: '/admin/changesrecorded.white.html',
data: tlcPhone
});
}
我尝试使用此代码将newPhone
的调用添加到phoneAjaxCalls
phoneAjaxCalls.push(newPhone(tlcPhone, stagingFormPhone.studentsdcid));
然后在我的代码中,我使用
$.when.apply($j, phoneAjaxCalls).done(function () {
//all phoneAjaxCalls MUST be complete before this code runs
//Redirect to a different page by changing window.location
});
解决jQuery延迟数组。
通过在DevTools中使用断点,我发现在调用newPhone
时调用$.when
,而不是在调用.push
时调用。{/ p>
如何在不调用newPhone
数组的情况下将phoneAjaxCalls
的调用添加到phoneAjaxCalls
数组中?
我看到的错误是,在- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees {
CGFloat radians = DegreesToRadians(degrees);
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0, self.size.width, self.size.height)];
CGAffineTransform t = CGAffineTransformMakeRotation(radians);
rotatedViewBox.transform = t;
CGSize rotatedSize = rotatedViewBox.frame.size;
UIGraphicsBeginImageContextWithOptions(rotatedSize, NO, [[UIScreen mainScreen] scale]);
CGContextRef bitmap = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(bitmap, rotatedSize.width / 2, rotatedSize.height / 2);
CGContextRotateCTM(bitmap, radians);
CGContextScaleCTM(bitmap, 1.0, -1.0);
CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2 , self.size.width, self.size.height), self.CGImage );
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
中的所有通话都可以完成之前,网页会被重定向。
如果您想查看我的整个代码库,可以看到here。这是一个非常混乱,因为这是一个匆忙的项目。欢迎任何其他反馈,在这里或在Github上。可以找到相关文件here。
答案 0 :(得分:1)
您可以使用bind:
phoneAjaxCalls.push(newPhone.bind(window, tlcPhone, stagingFormPhone.studentsdcid));
然后将您的调用更改为$.when
,以便真正调用返回所需承诺的函数:
$.when.apply($j, $.map(phoneAjaxCalls, $.call.bind($.call)).done(function () {
或者,以更易读的方式:
$.when.apply($j, $.map(phoneAjaxCalls, function(f){ return f() }).done(function () {
但是这个构造看起来像黑客,你真的需要存储函数而不是结构化参数,或者不是尽快执行ajax调用吗?
使用promises的正常方法是您在问题中显示的方式:您传递给done
的回调确实等待以便承诺完整填写。