باستخدام jQuery للحصول على كائنات JSON من الملف المحلي
-
04-10-2019 - |
سؤال
أحاول الحصول على قائمة بكائنات JSON (المنتجات) من ملف محلي باستخدام jQuery وتخزين جميع الكائنات في صفيف واحد تسمى Allitems. تم تحديد الملف المشترك في نفس الدليل مثل الرمز ، ويسمى "allitems.json". إليك كيف أفعل ذلك الآن:
function getAllSupportedItems(){
var allItems = new Array();
$.getJSON("allItems.json",
function(data){
$.each(data.items,
function(item){
allItems.push(item);
});
});
return allItems;
}
بناءً على هذا المثال: http://api.jquery.com/jquery.getjson/
المحلول
إلى عن على getAllSupportedItems
لتكون قادرة على إرجاع أي عناصر ، تحتاج مكالمة AJAX إلى تشغيل متزامن.
getJSON
يترجم إلى المكالمة غير المتزامنة التالية:
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
غير متزامن هو الافتراضي. لذلك تحتاج إلى تغيير طلبك بشكل صريح إلى واحد متزامن:
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback,
async: false
});
البديل هو إعادة التفكير في طريقة استخدامك getAllSupportedItems
وجعلها في فائدة غير متزامنة:
function getAllSupportedItems(callback){
$.getJSON("allItems.json",
function(data){
var allItems = [];
$.each(data.items,
function(item){
allItems.push(item);
});
callback(allItems);
// callback(data.items); should also work
});
}
تحديث
عندما كتبت في البداية هذه الإجابة ، لم يكن لدى jQuery دعمًا مؤلفًا. إنه أكثر إيجازًا ومرونة في فعل شيء مثل هذا اليوم:
function getAllSupportedItems( ) {
return $.getJSON("allItems.json").then(function (data) {
return data.items;
});
}
// Usage:
getAllSupportedItems().done(function (items) {
// you have your items here
});
نصائح أخرى
كيف تستخدم هذا؟ إذا كنت تتوقع الوظيفة الرئيسية ("getAllSupportedItems") إلى إرجاع الصفيف الذي تصنعه ، حسنًا ، لن ينجح. ال $.getJSON
الوظيفة هي غير متزامن, ، وبالتالي لن يقوم المعالج ببناء الصفيف فعليًا إلا بعد عودة الوظيفة الخارجية.