2015-01-02 2 views
2

약속 된 정보를 사용하여 현재 로그인 한 사용자와 SharePoint의 목록 필드를 비교하려고합니다.Ajax 약속 안 함

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

당신은 약속을 반환해야 (IMO 청소기)

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; 
    }); 
} 

나이 :

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()을 사용하는 것입니다. (I 예로 들어 Q 약속을 사용 하겠지만, 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 
    }); 
}