2015-01-02 187 views
2

我試圖使用承諾返回當前登錄的用戶和SharePoint中的列表中的字段的比較。阿賈克斯承諾不工作

function compareCurrentUserWithListObject() { 
    var userProp = this._userProfileProperties; 
    var userName = userProp.get_userProfileProperties()['UserName']; 

    return this._list.filter(function (element, index, array) { 
    var promise = jQuery.ajax({ 
     url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/GetUserById(" + element.user.get_lookupId() + ")", 
     type: "GET", 
     headers: { "Accept": "application/json;odata=verbose" } 
    }); 
    promise.done(function(data) { 
     return (data.d.Email.indexOf(userName) > -1); 
    }); 
    }); 
} 

function init() { 
    var userArray = this.compareCurrentUserWithListObject(); 
    userArray.done(function(res) { 
    if (res.length > 0) { 
     //Do some stuff after compare... 
    } 
    }); 
} 

我不知道我在這裏使用.done正確。有人能幫我嗎?

編輯:

工作代碼:

function compareCurrentUserWithListObject() { 
    var userProp = this._userProfileProperties; 
    var userName = userProp.get_userProfileProperties()['UserName']; 

    return this._list.filter(function (element, index, array) { 
    var promise = jQuery.ajax({ 
     url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/GetUserById(" + element.user.get_lookupId() + ")", 
     type: "GET", 
     headers: { "Accept": "application/json;odata=verbose" } 
    }); 
    promise.done(function(data) { 
     return (data.d.Email.indexOf(userName) > -1); 
    }); 
    return promise; 
    }); 
} 

function init() { 
    var userArray = this.compareCurrentUserWithListObject(); 
    if (userArray.length > 0) { 
     //Do some stuff after compare... 
    } 
} 
+0

什麼是不工作? – melancia

+0

它應該返回一個數字,它會在data.d.Email.indexOf(userName)中找到一個匹配,但在userArray.done中沒有任何反應。 – Robin

+0

你確定你的工作代碼實際上在工作嗎?因爲它似乎'userArray.length'是''0' **總是**。 – dfsq

回答

1

你需要返回的承諾

function compareCurrentUserWithListObject() { 
    var userProp = this._userProfileProperties; 
    var userName = userProp.get_userProfileProperties()['UserName']; 

    return this._list.filter(function (element, index, array) { 
    var promise = jQuery.ajax({ 
     url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/GetUserById(" + element.user.get_lookupId() + ")", 
     type: "GET", 
     headers: { "Accept": "application/json;odata=verbose" } 
    }); 
    promise.done(function(data) { 
     return (data.d.Email.indexOf(userName) > -1); 
    }); 
    // return promise here 
    return promise; 
    }); 
} 

或本(這是清潔IMO):

function compareCurrentUserWithListObject() { 
    var userProp = this._userProfileProperties; 
    var userName = userProp.get_userProfileProperties()['UserName']; 


    return jQuery.ajax({ 
     url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/GetUserById(" + element.user.get_lookupId() + ")", 
     type: "GET", 
     headers: { "Accept": "application/json;odata=verbose" } 
    }); 

} 


function init() { 
    this.compareCurrentUserWithListObject() 
    .done(function(data) { 
    var res = data.d.Email.indexOf(userName) > -1; 
    if (res.length > 0) { 
     //Do some stuff after compare... 
    } 
    }); 

} 

它看起來像你想修改水庫請在init之前使用它。有一種方法可以做到這一點,但我會在使用.done時回調。

我沒有測試這個代碼,所以可能會有錯誤。但一般的答案是:你需要回報承諾。

+0

他可以簡單地添加一個'return promise;'行。您不需要修改原始代碼! – JotaBe

+0

我知道,但它看起來像是想在數據傳遞給第二個'.done'回調之前修改'data'。 – ProblemsOfSumit

+0

嗯。第一個建議不起作用。它從不返回compareCurrentUserWithListObject函數中的.done值。 – Robin

0

使用承諾來做到這一點的慣用方法是使用Promise.all()。 (我將以Q promise爲例,但Promise.all內置於JS6承諾API和其他幾個承諾庫中):

function getUserInfo(listItem) { 
    var promise = jQuery.ajax({ 
     url: _spPageContextInfo.webAbsoluteUrl + 
      "/_api/web/GetUserById(" + listItem.user.get_lookupId() + ")", 
     type: "GET", 
     headers: { "Accept": "application/json;odata=verbose" } 
    }); 
    return Q.Promise.when(promise); 
} 

function filterUsers(users) { 
    var userProp = this._userProfileProperties; 
    var userName = userProp.get_userProfileProperties()['UserName']; 

    return users.filter(function (user) { 
     return user.d.Email.indexOf(userName) > -1; 
    }); 
} 

function init() { 
    Q.Promise.all(this._list.map(getUserInfo)) 
    .then(filterUsers.bind(this)) 
    .then(function (matchedUsers) { 
     // matchedUsers is an array of all the users you want. 
     // use it as needed 
    }); 
}